<?php


namespace App\Models\Myquery;
use App\Http\Common\Globals;
use App\Http\Common\MyUtils;
use Exception;
use Illuminate\Database\Query\Builder as BaseQueryBuilder;
use Illuminate\Support\Facades\Redis;

/**
 * 我的builder 继承了larvel自带的builder，$this->setTableRedisUpdated()是为了实现redis删除，修改，插入的时候自动更新redis
 * Class Builder
 * @package App\Models\Myquery
 */
class MyQueryBuilder extends BaseQueryBuilder
{
    /**
     * 运行 自己复写 的 sql语句
     * @return true
     */
    protected function runSelect()
    {
        try{
            if (env('REDIS_OPEN')){// 开启了redis缓存
                Globals::$orderBy = '';// 去掉全局排序
                return MyUtils::dbSelect($this->toSql(),$this->getBindings(),true);// 用自己的方法
            }else{
                return parent::runSelect();
            }
        }catch (Exception $e){// 报错了，就进行查询数据库，然后保存到redis里面
            // 得到相应sql语句的 更新时间 // 参数以及数据结合
            $md5 = md5(serialize(array_merge([$this->toSql()],array_filter($this->getBindings()))));
            $res = parent::runSelect();
            // 保存redis完成，就将reids的该表的更新状态写成false
            if (env('REDIS_OPEN')){
                Redis::set($md5,serialize($res));
                Redis::set($md5."-update-time",time());
            }
            return $res;
        }
    }
}
